/*************************************************************************
                           Stockage.c  -  description
                             -------------------
    début                : 15 Novembre 2012
*************************************************************************/

//---------- Réalisation du thread Stockage (fichier Stockage.c) -----

/////////////////////////////////////////////////////////////////  INCLUDE
//-------------------------------------------------------- Include système

#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <mqueue.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>

//------------------------------------------------------ Include personnel
#include "../Outils/config.h"
#include "../Outils/simulation.h"
#include "stockage.h"


void * Stockage()
{

	//-------------------------------Phase initialisation--------------------------
	int bytes_read;
	unsigned int msgPrio = PRIO_MSG_L;

	//Declaration des BAL
	mqd_t queue_versStockage;
	mqd_t queue_versArchivage;
	mqd_t queue_versErreur;

	//Declaration des messages
	MSG_carton msgPal;
	MSG_versArchivage msgStockage_archivage;
	MSG_versErreur msgErreur;

	//ouverture de BAL_versStockage en lecture seule
	queue_versStockage =  mq_open(BAL_versStockage, O_RDONLY);

	//ouverture de BAL_versArchivage en écriture seule
	queue_versArchivage =  mq_open(BAL_versArchivage, O_WRONLY);

	//ouverture de BAL_versErreur en écriture seule
	queue_versErreur =  mq_open(BAL_versErreur, O_WRONLY);

	//-------------------------------Phase moteur--------------------------
	for ( ; ;)
	{
 	 	//attente d'un message de Palette
 		bytes_read = mq_receive(queue_versStockage, (char*)&msgPal, sizeof(MSG_carton), NULL);

  		if (bytes_read == -1)
 		{
   			perror("[Stockage] Failed to recieve BAL_versStockage:");
  		}
  		else
  		{
			//lecture des messages 
			int typePal=msgPal.type;
			//int numCartonPal=msgPal.numCarton;
			int numLotPal=msgPal.numLot;
			char typeProduitPal=msgPal.typeProduit;

			if (typePal == CARTON)
			{
				if (typeProduitPal == 'A')
				{

					//Incrementation du nombre de palettes dans la mempartagee
					pthread_mutex_lock(MutexSHMStock);
					ZoneStockage->nbPaletteA+=1;
					pthread_mutex_unlock(MutexSHMStock);


					//ecriture du message msgStockage_archivage
					msgStockage_archivage.source=T_STOCKAGE;
					msgStockage_archivage.message=STOCK_OK;
					msgStockage_archivage.heure=time(NULL);
					msgStockage_archivage.numLot=numLotPal;
					msgStockage_archivage.cartonEnCours=0;
					msgStockage_archivage.type=ARCHIVAGE;
					
					//envoi du message msgPaletteOK à Archivage
					if (0 != mq_send(queue_versArchivage,(const char*)&msgStockage_archivage,sizeof(MSG_versArchivage),msgPrio))
					{
						perror ("[Stockage] Failed to Send BAL_versArchivage:");
					}
					#ifdef DEBUG
					printf("[STOCKAGE] Palette A stockee \n");
					#endif
				}
				else
				{
					if (typeProduitPal == 'B')
					{

						//Incrementation du nombre de palettes dans la mempartagee
						pthread_mutex_lock(MutexSHMStock);
						ZoneStockage->nbPaletteB+=1;
						pthread_mutex_unlock(MutexSHMStock);

						//ecriture du message msgStockage_archivage
						msgStockage_archivage.source=T_STOCKAGE;
						msgStockage_archivage.message=STOCK_OK;
						msgStockage_archivage.heure=time(NULL);
						msgStockage_archivage.numLot=numLotPal;
						msgStockage_archivage.cartonEnCours=0;
						msgStockage_archivage.type=ARCHIVAGE;

						//envoi du message msgStockage_archivage à Archivage
						if (0 != mq_send(queue_versArchivage,(const char*)&msgStockage_archivage,sizeof(MSG_versArchivage),msgPrio))
						{
							perror ("[Stockage] Failed to Send BAL_versArchivage:");
						}
						#ifdef DEBUG
						printf("[STOCKAGE] Palette B stockee \n");
						#endif
					} //fin if typeProduit B


				} //fin if typeProduit A
			}	
			else
			{
				if (typePal == FIN_APPLI)
				{
					//ecriture à Archivage "demande d'arret de la chaine de production"
					msgStockage_archivage.source=T_STOCKAGE;
					msgStockage_archivage.message=DEMANDE_FIN;
					msgStockage_archivage.heure=time(NULL);
					msgStockage_archivage.numLot=numLotPal;
					msgStockage_archivage.cartonEnCours=0;
					msgStockage_archivage.type=ARCHIVAGE;

					//envoi du message msgPaletteOK à Archivage
					if (0 != mq_send(queue_versArchivage,(const char*)&msgStockage_archivage,sizeof(MSG_versArchivage),msgPrio))
					{
						perror ("[Stockage] Failed to Send BAL_versArchivage:");
					}
				}
				else 
				{
					if (typePal == FIN_PROD)
					{
						//ecriture à Archivage "la production est terminée"
						msgStockage_archivage.source=T_STOCKAGE;
						msgStockage_archivage.message=FIN_PRODUCTION;
						msgStockage_archivage.heure=time(NULL);
						msgStockage_archivage.numLot=numLotPal;
						msgStockage_archivage.cartonEnCours=0;
						msgStockage_archivage.type=ARCHIVAGE;

						//envoi du message msgPaletteOK à Archivage
						if (0 != mq_send(queue_versArchivage,(const char*)&msgStockage_archivage,sizeof(MSG_versArchivage),msgPrio))
						{
							perror ("[Stockage] Failed to Send BAL_versArchivage:");
						}


						//ecriture à BAL_versErreur 
						msgErreur.source=T_STOCKAGE;
						msgErreur.message=FIN_PROD;
						msgErreur.heure=time(NULL);
						msgErreur.numLot=numLotPal;
						msgErreur.cartonEnCours=0;

						//envoi du message production terminée à Erreur
						if (0 != mq_send(queue_versErreur,(const char*)&msgErreur,sizeof(MSG_versErreur),msgPrio))
						{
							perror ("[Stockage] Failed to Send BAL_versErreur:");
						   		
						}
					
					}
				}

				//Fermeture des BAL
				mq_close (queue_versArchivage); 
				mq_close (queue_versStockage);
				mq_close (queue_versErreur);

				//destruction du thread
				pthread_exit(NULL);
	
			} //fin erreur ou carton

  		} //fin if reception

	}
//-------------------------------FIN Phase moteur--------------------------


} //fin procedure
